Zaczalem wlasnie programowac w assemblerze (kompilator NASM/Linux). Ucze
sie z kursu Bogdana (bogdro). Niestety juz na samym poczatku natrafilem
na problemy. Czy ktos moglby mi wytlumaczyc, dlaczego taki kod wykonuje
sie poprawnie:
<code
; program kopiuje do cx drugi element tablicy tab
section .text
global _start
tab times 12 dw 0bbh
_start:
mov cx,[tab+2]
mov eax,1
int 80h
</code
a przy wykonywaniu takiego otrzymuje "Segmentation fault":
<code
;program kopiuje do drugiego elementu tablicy tab wartosc 0FFh
section .text
global _start
tab times 12 dw 0bbh
_start:
mov cx,0ffh
mov [tab+2],cx
mov eax,1
int 80h
</code
?
Co jest zle w powyzszym (drugim) kodzie?
**********
W drugiej lekcji tego kursu znajduje takie oto zadanie:
<quote
Zadeklaruj tablicę 12 słów (16-bitowych) o wartości BB (szestnastkowo),
po czym do każdego z tych słów wpisz wartość FF szestnastkowo (bez
żadnych pętli).
</quote
Nasuwa mi sie wobec tego pytanie. Czy majac tablice zdefiniowana tak:
tab times 12 dw 0bbh
moge ja nadpisac wartosciami 0ffh za pomoca jednej instrukcji? Wydaje mi
sie ze da sie to zrobic trzema wykonaniami instrukcji mov, wystarczy
tylko ze w odpowiednie miejsce w tablicy tab (pola: tab[0], tab[4],
tab[8]) wpisze wartosci typu dq. Mam racje? Przecież w tym momencie
tablica tab w pamieci ma postac:
BB00BB00BB00BB00BB00BB00BB00BB00BB00BB00BB00BB00
a odpowiednia wartosc typu dq mialaby postac:
FF00FF00FF00F00.
Da sie tak zrobic? Za pomoca mov? Moglby ktos mi to pokazac?
Licze na Wasze odpowiedzi!